package com.example.mardan_demo1.controller;

import com.example.mardan_demo1.mapper.UserMapper;
import com.example.mardan_demo1.pojo.QiYeYongHu.QiYeYongHu;
import com.example.mardan_demo1.pojo.Result;
import com.example.mardan_demo1.pojo.User;
import com.example.mardan_demo1.service.UserService;
import com.example.mardan_demo1.utils.JWTUtil;
import com.example.mardan_demo1.utils.ThreadLocalUtil;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.HashMap;
import java.util.Map;

// 请求会第一个到这里
// 先到控制层  控制层到服务层  服务层到数据层mapper这里
// /user 是第一个映射路径， /register是第二个映射路径

@RestController
// 路由注解
@RequestMapping("/user")
//校验参数注解
@Validated
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private UserMapper userMapper;

    /**
     * ApiName:获取部门列表
     * @return BuMen
     */
    @PostMapping("/bumen-liebiao")
    public Result buMenLieBiao() {
        return userService.buMenLieBiao();
    }
    /**
     * ApiName: 新增部门
     * ApiDes:
     * @param mingCheng {String} 部门名称
     * @param xuHao {Integer} 部门序号
     * @return 响应描述：
     */
    @PostMapping("/bumen-xinzeng")
    public Result buMenXinZeng(@NotNull String mingCheng,
                               @NotNull Integer xuHao) {
        return userService.buMenXinZeng(mingCheng, xuHao);
    }
    /**
     * ApiName: 给用户新增部门和职务
     * ApiDes:
     * @param userId 用户id
     * @param bumenId 部门id
     * @param role 用户身份
     * @return 响应描述：
     */

    @PostMapping("/yonghu-shezhi-zhiwu")
    public Result  yongHuSheZhiZhiWu(@NotNull Integer userId,
                                     @NotNull Integer bumenId,
                                     @NotNull @Pattern(regexp = "科员|副主任|主任", message = "角色必须是科员、副主任或主任") String role) {
        return userService.yongHuSheZhiZhiWu(userId, bumenId, role);
    }


    /**
     * ApiName:获取用户列表
     * ApiDes:
     * @tags 用户
     * @param name 昵称
     * @param userName 登录名
     * @param pageSize 页面大小
     * @param pageNum 页面大小
     * @return 响应描述：
     */

    @PostMapping("/list")
    public Result getUserList(String name,
                              String userName,
                              @NotNull Integer pageSize,
                              @NotNull Integer pageNum) {
        return userService.getUserList(name, userName, pageSize, pageNum);
    }

    /**
     * ApiName:管理员根据用户id更新用户信息
     * ApiDes:
     * @tags 用户
     * @param userId 用户id
     * @param name 用户昵称
     * @param password 用户密码
     * @param buMenId 部门id
     * @param role 用户职务
     * @return 响应描述：
     */
    @PostMapping("/admin-update-user-info")
    public Result adminUpdateUserInfo(
            @NotNull Integer userId,
            @NotNull @NotEmpty String name,
            @NotEmpty String password,
            @NotNull  Integer buMenId,
            @NotNull @Pattern(regexp = "科员|副主任|主任", message = "角色必须是科员、副主任或主任") String role ) {
            return userService.adminUpdateUserInfo(userId, name, password, buMenId, role);
        }
    /**
     * ApiName:管理员根据用户id获取用户信息
     * ApiDes:
     * @param userId  用户id
     * @return 响应描述：
     */
    @PostMapping("/admin-get-user-by-id")
    public Result adminGetUserById(@NotNull Integer userId) {
        return userService.adminGetUserById(userId);
    }
    /**
     * ApiName:新增用户
     * ApiDes:
     * @param name 用户昵称
     * @param username 用户登录账号
     * @param password 用户密码
     * @param buMenId 部门id
     * @param role 用户角色
     * @return 响应描述：
     */
    @PostMapping("/addUser")
    public Result addUser(@NotNull @NotEmpty String name,
                          @NotNull @NotEmpty String username,
                          @NotEmpty String password,
                          @NotNull  Integer buMenId,
                          @NotNull @Pattern(regexp = "科员|副主任|主任", message = "角色必须是科员、副主任或主任") String role ) {
        return userService.addUser(name, username, password, buMenId, role);
    }
    /**
     * ApiName:编辑用户基本信息
     * ApiDes:用户只能编辑自己的
     * @param user
     * @return 响应描述：
     */
    @PostMapping("/updateDetail")
    public Result updateDetail( User user) {
        return userService.updateDetail(user);
    }
    /**
     * ApiName:用户获取个人信息
     * ApiDes:
     * @param
     * @return 响应描述：
     */

    @PostMapping("/getuserdetail")
    public Result getUserDetail() {
        return userService.getUserDetail();
    }
    /**
     * ApiName:用户获取权限信息
     * ApiDes:
     * @param
     * @return 响应描述：
     */

    @PostMapping("/getuserinfo")
    public Result getUserInfo() {
        return userService.getUserInfo();
    }
    /**
     * ApiName:用户更新自己的信息
     * ApiDes:
     * @param user
     * @return 响应描述：
     */
    @PostMapping("/user-update-detail")
    public Result userUpdateDetail(User user) {
        return userService.userUpdateDetail(user);
    }
    /**
     * ApiName:用户修改自己的密码
     * ApiDes:
     * @param oldPassWord 旧密码
     * @param newPassWord 新密码
     * @param rePassWord 重复输入的新密码
     * @return 响应描述：
     */
    @PostMapping("/updatePwd")
    public Result updatePwd(
            @RequestParam String oldPassWord,
            @RequestParam String newPassWord,
            @RequestParam String rePassWord
            ) {
        return userService.updatePassWd(oldPassWord,newPassWord,rePassWord);
    }

    /**
     * ApiName:用户更新头像
     * ApiDes:
     * @param avatarURL 头像图片地址
     * @return 响应描述：
     */

    @PatchMapping("/updateAvatar")
    public Result updateAvatar(@RequestParam @URL String avatarURL) {
        userService.updateAvatar(avatarURL);
        return Result.success();
    }
    /**
     * ApiName:用户更新自己的信息
     * ApiDes:
     * @param user
     * @return 响应描述：
     */

    @PutMapping("/update")//put请求注解
//    @Validated注解是让User实体类里面的参数校验的注解生效
    public Result update(@RequestBody @Validated User user) {
        userService.update(user);
        return Result.success();

    }

    @GetMapping("/userInfo")
    public Result<User> userInfo(@RequestHeader(name = "Authorization") String token){
//    根据用户名查询用户
//        Map<String, Object> map = JWTUtil.parseToken(token);
//        String username = (String) map.get("username");
        Map<String,Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User user = userService.findUserByUserName(username);
        return Result.success(user);
    }
    /**
     * ApiName:用户登录
     * ApiDes:
     * @param userName 用户名
     * @param userPwd 用户密码 requirements
     * @return 响应描述： 返回一个token
     */
    @PostMapping("/login")
    public Result<String> login( String userName ,  String userPwd) {
          return userService.login(userName, userPwd);
    };
    /**
     * ApiName:用户注册
     * ApiDes:
     * @param username 用户名
     * @param password 密码
     * @param name 昵称
     * @param email 邮箱
     * @param userAvatar 用户头像
     */
    @PostMapping("/register")
    public Result register( @Pattern(regexp = "^\\S{5,16}$") String username ,
                            @Pattern(regexp = "^\\S{5,16}$") String password,
                            String name,
                            String email,
                            String userAvatar
                            ){
//    查询用户
        User u = userService.findUserByUserName(username);
        System.out.println(username);
        System.out.println(u);
        if (u == null){
//            没有占用
//            注册
            userService.register(username, password,name,email,userAvatar);
            return Result.success();
        }else {
//             已被占用
            return Result.error("用户名已被占用");
        }
//    注册用户
    }
    /**
     * ApiName:企业用户注册
     * ApiDes:
     * @param yongHu
     * @return 响应描述：
     */
    @PostMapping("/qiye-zhuce")
    public Result qiYeZhuCe(QiYeYongHu yongHu) {
        return userService.qiYeZhuCe(yongHu);
    }
    /**
     * ApiName: 企业用户获取个人信息
     * ApiDes:
     * @param
     * @return 响应描述：
     */
    @PostMapping("/qiyeyonghu-getUserInfo")
    public Result qiYeYongHuGetUserInfo() {
        return userService.qiYeYongHuGetUserInfo();
    }


}

